#include<bits/stdc++.h>
using namespace std;
const int inf=1e9,maxn=2005;
int op,n,p[maxn],C[maxn][maxn],g[maxn][maxn];
int dis[maxn],cnt[maxn];
inline int read() {
	int x;
	scanf("%d",&x);
	return x;
}
inline int dfs(int u,int flow) {
	int v,temp,delta=0;
	if(u==n)return flow;
	for(v=1; v<=n; v++)
		if(g[u][v]&&dis[u]==dis[v]+1) {
			temp=dfs(v,min(flow-delta,g[u][v]));
			g[u][v]-=temp;
			g[v][u]+=temp;
			delta+=temp;
			if(delta==flow||dis[op]>=n)return delta;
		}
	if(dis[op]>=n)return delta;
	cnt[dis[u]]--;
	if(cnt[dis[u]]==0) dis[op]=n;
	dis[u]++;
	cnt[dis[u]]++;
	return delta;
}
int main() {
	int N=read(),B=read();
	op=N+B+1,n=op+1;
	for(int i=1; i<=N; i++) {
		for(int j=1; j<=B; j++) {
			C[i][j]=read();
		}
	}
	for(int i=1; i<=B; i++) p[i]=read();
	for(int o=0; o<B; o++){
		for(int k=1; k+o<=B; k++) {
			memset(g,0,sizeof(g));
			memset(dis,0,sizeof(dis));
			for(int i=1; i<=N; i++)g[op][i]++;
			for(int i=1; i<=B; i++)g[i+N][n]+=p[i];
			for(int i=1; i<=N; i++) {
				for(int j=k; j<=k+o; j++) {
					g[i][C[i][j]+N]++;
				}
			}
			int Tmp=0;
			while(dis[op]<n) Tmp+=dfs(op,inf);
			if(Tmp==N) {
				printf("%d",o+1);
				return 0;
			}
		}
	}
}
